package com.woniuxy.controller;
/**
 * @author 曾令忠
 */
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayFundTransToaccountTransferRequest;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.response.AlipayFundTransToaccountTransferResponse;
import com.woniuxy.configuration.AlipayConfig;
import com.woniuxy.entity.User;
import com.woniuxy.service.WalletService;
import com.woniuxy.util.CommonUtil;

@Controller
@RequestMapping("/alipay")
public class PayController {
	@Autowired
	WalletService walletService;

	private static int wid;
	private static double money;

	@RequestMapping("/pay")
	public void payController(HttpServletRequest request, HttpServletResponse response, int id, String num)
			throws IOException {
		// 获得初始化的AlipayClient
		AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.APP_ID,
				AlipayConfig.APP_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
				AlipayConfig.sign_type);

		// 设置请求参数
		AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
		alipayRequest.setReturnUrl(AlipayConfig.return_url);
		alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
		money = Double.parseDouble(num);
		wid = id;
		// 商户订单号，商户网站订单系统中唯一订单号，必填
		String out_trade_no = CommonUtil.getCurrentTime();
		// 付款金额，必填
		String total_amount = num;
		// 订单名称，必填
		String subject = "充值";
		// 商品描述，可空
		String body = "hifit余额充值";

		alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount
				+ "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\","
				+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

		// 若想给BizContent增加其他可选请求参数，以增加自定义超时时间参数timeout_express来举例说明
		// alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
		// + "\"total_amount\":\""+ total_amount +"\","
		// + "\"subject\":\""+ subject +"\","
		// + "\"body\":\""+ body +"\","
		// + "\"timeout_express\":\"10m\","
		// + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
		// 请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节

		// 请求
		String form = "";
		try {
			form = alipayClient.pageExecute(alipayRequest).getBody(); // 调用SDK生成表单
		} catch (AlipayApiException e) {
			e.printStackTrace();
		}
		response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
		response.getWriter().write(form);// 直接将完整的表单html输出到页面
		response.getWriter().flush();
		response.getWriter().close();
	}

	/**
	 * 同步跳转
	 * 
	 * @param request
	 * @throws Exception
	 */
	@RequestMapping("/returnUrl")
	public String returnUrl(HttpServletRequest request) throws Exception {

		// 获取支付宝GET过来反馈信息（官方固定代码）
		Map<String, String> params = new HashMap<String, String>();
		Map<String, String[]> requestParams = request.getParameterMap();
		for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
			String name = (String) iter.next();
			String[] values = (String[]) requestParams.get(name);
			String valueStr = "";
			for (int i = 0; i < values.length; i++) {
				valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
			}
			params.put(name, valueStr);
		}
		boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,
				AlipayConfig.sign_type); // 调用SDK验证签名

		// 返回界面
		if (signVerified) {
			try {
				walletService.deposit(wid, money);
			} catch (Exception e) {
				e.printStackTrace();
			}
			System.out.println("前往支付成功页面");
			return "redirect:/zlz/mywallet.html";
		}
		System.out.println("前往支付失败页面");
		return "redirect:/zlz/pay_fail.html";
	}

	/**
	 * 支付宝服务器异步通知
	 * 
	 * @param request
	 * @throws Exception
	 */
	@RequestMapping("/notifyUrl")
	public void notifyUrl(HttpServletRequest request) throws Exception {
		// 获取支付宝GET过来反馈信息
		Map<String, String> params = new HashMap<String, String>();
		Map<String, String[]> requestParams = request.getParameterMap();
		for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
			String name = (String) iter.next();
			String[] values = (String[]) requestParams.get(name);
			String valueStr = "";
			for (int i = 0; i < values.length; i++) {
				valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
			}
			params.put(name, valueStr);
		}

		boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,
				AlipayConfig.sign_type); // 调用SDK验证签名

		if (signVerified) { // 验证成功 更新订单信息
			System.out.println("异步通知成功");
			// 商户订单号
			String out_trade_no = request.getParameter("out_trade_no");
			System.out.println("out_trade_no:" + out_trade_no);
			// 交易状态
			String trade_status = request.getParameter("trade_status");
			System.out.println("trade_status:" + trade_status);
			// 修改数据库
			try {
				walletService.deposit(wid, money);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else {
			System.out.println("异步通知失败");
		}
	}

	@RequestMapping("/outPay")
	@ResponseBody
	public Map<String,String> transferUser(String amount) {
		System.out.println(amount);
		String account = "xktpqg2781@sandbox.com";
		String name = "沙箱环境";
		String remark = "支付宝转账";
		Map<String,String> resultMap=new HashMap<String,String>();
		AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.APP_ID,
				AlipayConfig.APP_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
				AlipayConfig.sign_type);
		AlipayFundTransToaccountTransferRequest request = new AlipayFundTransToaccountTransferRequest();
		String out_biz_no = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date());
		request.setBizContent("{" + "\"out_biz_no\":\"" + out_biz_no + "\"," + "\"payee_type\":\"ALIPAY_LOGONID\","
				+ "\"payee_account\":\"" + account + "\"," + "\"amount\":\"" + amount + "\","
				+ "\"payer_show_name\":\"支付商户信息\"," + "\"payee_real_name\":\"" + name + "\"," + "\"remark\":\"" + remark
				+ "\"" + "  }");
		AlipayFundTransToaccountTransferResponse response;
		try {
			response = alipayClient.execute(request);
			if("10000".equals(response.getCode())){
				User user = CommonUtil.getCurrentUser();
				int res = walletService.outPay(user.getId(),amount);
				if(res==2) {
					resultMap.put("success", "false");
					resultMap.put("des", "账户余额不足");
				}else if(res==1) {
					resultMap.put("success", "true");
					resultMap.put("des", "提现成功");
				}
			}else{
				resultMap.put("success", "false");
				resultMap.put("des", response.getSubMsg());
			}
		} catch (AlipayApiException e) {
			e.printStackTrace();
			resultMap.put("success", "false");
			resultMap.put("des", "转账失败！");
		}
		return resultMap;
	}

}
